//
//  StatusDAL.swift
//  XinLangWeibo10
//
//  Created by 白利兵 on 15/11/12.
//  Copyright © 2015年 itheima. All rights reserved.
//

import Foundation

class StatusDAL {
    // 1. 把网络返回来的数据，缓存到数据库中
    
    // 2. 判断是否有缓存
    
    // 3. 加载缓存数据
    
    // 4. 从网络上请求数据
    
    // 5. 返回网络数据
}
extension StatusDAL {
    // MARK: -加载微博数据
    class func loadStatusData(since_id: Int, max_id: Int, finished: (array: [[String: AnyObject]]?) -> ()) {
        // 检查数据库缓存
        guard let array = checkCacheData(since_id, maxId: max_id) else {
            // 从网络加载数据
            NetworkTools.sharedTools.loadStatus(since_id, max_id: max_id, finished: { (result, error) -> () in
                if error != nil {
                    print("网路加载错误")
                    finished(array: nil)
                    return
                }
                // 判断数据类型（result根节点为字典,次节点为数组）
                guard let statusArray = result?["statuses"] as? [[String: AnyObject]] else {
                    print("数据格式错误")
                    finished(array: nil)
                    return
                }
                // 保存数据到数据库中
                StatusDAL.saveCacheData(statusArray)
                finished(array: statusArray)
            })
            return
        }
        // 通过闭包参数，返回数组数据
        finished(array: array)
    }
    // MARK: - 检查数据库是否有缓存
    private class func checkCacheData(sinceId: Int, maxId: Int) ->[[String: AnyObject]]?{
        // 判断用户是否已经登录
        guard let userId = UserAccountViewModel.shareUserAccount.account?.uid else {
            print("用户还未登陆")
            return nil
        }
        var sql = "SELECT statusId, status, userId FROM T_Status \n"
        sql += "WHERE userId = \(userId) \n"
        // 判断是上拉刷新还是下拉刷新
        if sinceId > 0 {
            // 准备sql
            sql = "SELECT  statusId, status, userId FROM T_Status WHERE statusId > \(sinceId) \n"
        }
        else if maxId > 0 {
            sql = "SELECT  statusId, status, userId FROM T_Status WHERE statusId < \(maxId) \n"
        }
        sql += "ORDER BY statusId DESC LIMIT 20;"
        // 执行sql,查询数据库
        let array = SQLiteManager.sharedManager.execRecordSet(sql)
        if array?.count == 0 {
            return nil
        }
        var statusArray = [[String: AnyObject]]()
        // 遍历数组
        for dict in array! {
            //print("dict = \(dict)") // 确认数据格式：二进制
            let jsonData = dict["status"] as! NSData
            // 序列化二进制数据
            let status = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
            statusArray.append(status as! [String : AnyObject])
        }
       return statusArray
    }
    
    // MARK: - 保存网络返回的数据到数据库
    private class func saveCacheData(array: [[String: AnyObject]]) {
        
        // 0. 用户 id
        guard let userId = UserAccountViewModel.shareUserAccount.account?.uid else {
            print("用户没有登录")
            return
        }
        
        // 1. 准备 SQL
        /**
        1. 微博 id -> 通过字典获取
        2. 微博 json -> 字典序列化
        3. userId -> 登录的用户
        */
        let sql = "INSERT OR REPLACE INTO T_Status (statusId, status, userId) VALUES (?, ?, ?);"
        
        // 2. 遍历数组 - 如果不能确认数据插入的消耗时间，可以在实际开发中，写测试代码
        SQLiteManager.sharedManager.queue.inTransaction { (db, rollback) -> Void in
            
            for dict in array {
                // 1> 微博 id
                let statusId = dict["id"] as! Int
                // 2> 序列化字典 -> 二进制数据
                let json = try! NSJSONSerialization.dataWithJSONObject(dict, options: [])
                
                // 3> 插入数据
                if !db.executeUpdate(sql, statusId, json, userId) {
                    print("插入数据失败")
                    // 回滚
                    rollback.memory = true
                    // break
                    break
                }
            }
        }
        print("数据插入完成！")
    }
}

















